package com.zyl.file.platform;

import com.amazonaws.services.s3.model.PartSummary;
import com.zyl.file.dto.FilePartInfoDTO;
import com.zyl.file.dto.UploadDTO;
import com.zyl.file.po.StFile;
import com.zyl.file.vo.UploadSplitVO;

import java.io.InputStream;
import java.util.List;
import java.util.function.Consumer;

/**
 * 文件存储接口，对应各个平台
 *
 * @author PJW
 */
public interface FileStorage extends AutoCloseable {

    /**
     * 获取平台
     *
     * @return Result
     */
    String getPlatform();

    /**
     * 获取平台类型
     *
     * @return Result
     */
    String getPlatformType();

    /**
     * 获取平台类型
     *
     * @return Result
     */
    String getDomain();

    /**
     * 获取平台类型
     *
     * @return Result
     */
    String getBucketName();

    /**
     * 设置平台
     *
     * @param platform 平台名
     */
    void setPlatform(String platform);

    /******************************************************分片上传***************************************************/

    /**
     * 根据md5标识获取分片上传任务
     *
     * @param identifier 文件md5
     * @return Result
     */
    StFile getByIdentifier(String identifier, Long id);

    /**
     * 初始化一个任务
     *
     * @param stFile 文件对象
     */
    void initTask(StFile stFile);

    /**
     * 获取上传进度
     *
     * @param stFile 文件信息
     * @return Result
     */
    List<PartSummary> getTaskInfo(StFile stFile);

    /**
     * 生成预签名上传url
     *
     * @param stFile 文件信息
     * @return Result
     */
    String genPreSignUploadUrl(StFile stFile);

    /**
     * 分片文件上传
     *
     * @param uploadSplitVO 分片文件信息
     * @return Result
     */
    FilePartInfoDTO uploadSplit(UploadSplitVO uploadSplitVO);

    /**
     * 合并分片
     *
     * @param stFile 文件信息
     */
    void merge(StFile stFile);

    /******************************************************普通上传***************************************************/

    /**
     * 初始化一个任务
     *
     * @param uploadDTO 上传对象
     * @return Result
     */
    StFile upload(UploadDTO uploadDTO);
    /******************************************************文件处理***************************************************/

    /**
     * 获取文件流
     *
     * @param key St_file表中的object_key
     * @return Result
     */
    InputStream getFileStream(String key);

    /**
     * 获取文件大小
     *
     * @param key St_file表中的object_key
     * @return Result
     */
    Long getFileSize(String key);

    /**
     * 替换文件
     * @param uploadDTO 上传对象
     * @return StFile
     */
    StFile replaceFile(UploadDTO uploadDTO);

    /**
     * 获取文件地址
     *
     * @param key key
     * @return Result
     */
    String getPath(String key);

    /**
     * 删除文件
     *
     * @param url 文件相对路径
     * @return Result
     */
    boolean delete(String url);

    /**
     * 下载文件
     * @param stFile 文件对象
     * @param consumer consumer
     */
    void download(StFile stFile, Consumer<InputStream> consumer);

    /**
     * 释放相关资源
     */
    @Override
    default void close() {
    }
}
